package com.summer.service.impl;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.summer.entity.Dish;
import com.summer.entity.DishDto;
import com.summer.entity.DishFlavor;
import com.summer.mapper.DishMapper;
import com.summer.service.DishFlavorService;
import com.summer.service.DishService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.ArrayList;
import java.util.List;

@Service
public class DishServiceImpl extends ServiceImpl<DishMapper, Dish> implements DishService {

    @Autowired
    private DishFlavorService dishFlavorService;

    @Override
    public void addDishAndFlavor(DishDto dishDto) {
        // 1. 补充封装Dish         -code需要补充 这里暂时不补充
        // 2. 调用MP接口添加
        super.save(dishDto);  // TODO 本来dto中没有id值，调用此方法后自动为id生成uuid值（执行sql语句前赋值）
        // 3. 补充封装DishFlavor   -dishID需要补充
        Long dishId = dishDto.getId();  // 必须在save方法后，否则没有值

        List<DishFlavor> flavors = dishDto.getFlavors();
        for(int i=0; i < flavors.size(); i++){
            DishFlavor dishFlavor = flavors.get(i);
            dishFlavor.setDishId(dishId);
            flavors.set(i, dishFlavor);
        }
        // 4. 调用MP接口添加
        dishFlavorService.saveBatch(flavors); //TODO service层的批量添加API
        // 5. 事务处理（有多条sql语句） TODO
        // 6. 异常处理  TODO 添加操作注意唯一约束异常，删除操作注意关联其他表属性异常

    }

    @Override
    public void updateDishAndFlavorById(DishDto dishDto) {
        //1. 调用service修改dish表：根据id修改
        this.updateById(dishDto);
        //2. 调用service修改dishFlavor表 根据dish_id修改
        //2.1 修改口味表中dishId为本菜品id的记录 TODO 先删除后增加
        LambdaQueryWrapper<DishFlavor> lqw = new LambdaQueryWrapper<>();
        Long dishId = dishDto.getId();
        lqw.eq(DishFlavor::getDishId, dishId);
        dishFlavorService.remove(lqw);

        //2.2 添加。首先为flavors列表中的每个flavor设置dishId TODO 此处用函数式编程简化代码（stream方式）
        List<DishFlavor> flavors = dishDto.getFlavors();
        for (int i = 0; i < flavors.size(); i++) {
            DishFlavor dishFlavor = flavors.get(i);
            dishFlavor.setDishId(dishId);
            flavors.set(i,dishFlavor);
        }
        dishFlavorService.saveBatch(flavors);
    }

    @Override
    public void deleteByIds(long[] ids) {
        List<Long> idList= new ArrayList<>();

        for (long id : ids) {
            idList.add(id);
            //1. 关联删除dishFlavor
            LambdaQueryWrapper<DishFlavor> lqw = new LambdaQueryWrapper<>();
            lqw.eq(DishFlavor::getDishId, id);
            dishFlavorService.remove(lqw);
        }
        //2. 删除dish
        this.removeByIds(idList);

        //3. 异常处理 TODO -注意关联了其他表的记录（外键，但此项目的表结构设计中无外键），若不能删除要抛出异常，此处已关联删除解决

    }
}
